#include <iostream>
// Obsluga i implementacja algorytmu huffmana
#include "huffman.hpp"
// Obsluga i implementacja algorytmu arytmetycznego
#include "arithmetic.hpp"
// Obsluga plikow we/wy
#include <fstream>
#include "differences.hpp"
#include <math.h>
#include <string>
#include <algorithm>
#include <cstdlib>

using namespace std;

int main(const int argc, char *const argv[]){

    char wybor;
    cHuffman h_obiekt;
    Arythmetic a_obiekt;
    const char *t = "temp.bmp";
    if(argv[1] && argv[2] && argv[3] && argv[4])
    switch(argv[1][1]){
        case 'a':
            if(argv[2])
            switch(argv[2][1]){
                case 'k':

                    cout << "Kodowac roznice pixeli dla obrazu?(t/n)";
                    cin >> wybor;
                    if(wybor == 't' || wybor == 'y'){
                        cout << "Kodowanie roznic..\n";
                        img_difference(argv[3]);
                        cout << "Kodowanie..\n";
                        a_obiekt.Encode((char*)t, argv[4]);
                        system("rm temp.bmp");
                    }else{
                        cout << "Kodowanie..\n";
                        a_obiekt.Encode(argv[3], argv[4]);}
                    break;
                case 'd':

                        cout << "Kodowane byly roznice pixeli dla obrazu?(t/n)";
                        cin >> wybor;
                        if(wybor == 't' || wybor == 'y'){
                            cout << "Dekodowanie..\n";
                            a_obiekt.Decode((char*)t, argv[3]);
                            cout << "dekodowanie roznic..\n";
                            un_img_difference(argv[4]);
                            system("rm temp.bmp");
                        }else{
                            cout << "Dekodowanie..\n";
                            a_obiekt.Decode(argv[4], argv[3]);
                        }
                        break;
            }
            else
                cout <<"Podaj argumenty:\n\tKodowanie arytmetyczne:\n\t-k - kodowanie pliku \n\t-d - dekodowanie pliku\n\t-plik wejsciowy \n\t-plik wyjsciowy";
            break;

        case 'h':


            if(argv[2])
            switch(argv[2][1]){
                case 'k':

                    cout << "Kodowac roznice pixeli dla obrazu?(t/n)";
                    cin >> wybor;
                    if(wybor == 't' || wybor == 'y'){
                        cout << "Kodowanie roznic..\n";
                        img_difference(argv[3]);
                        cout << "Kodowanie..\n";
                        h_obiekt.vKoder("temp.bmp", argv[4]);
                        system("rm temp.bmp");
                    }else{
                        cout << "Kodowanie..\n";
                        h_obiekt.vKoder(argv[3], argv[4]);}
                    break;
                case 'd':

                        cout << "Kodowane byly roznice pixeli dla obrazu?(t/n)";
                        cin >> wybor;
                        if(wybor == 't' || wybor == 'y'){
                            cout << "Dekodowanie..\n";
                            h_obiekt.vDekoder(argv[3], "temp.bmp");
                            cout << "dekodowanie roznic..\n";
                            un_img_difference(argv[4]);
                            system("rm temp.bmp");
                        }else{
                            cout << "Dekodowanie..\n";
                            h_obiekt.vDekoder(argv[3], argv[4]);
                        }
                        break;
            }
            else
                cout <<"Podaj argumenty:\n\tKodowanie huffmana:\n\t-k - kodowanie pliku \n\t-d - dekodowanie pliku\n\t-plik wejsciowy \n\t-plik wyjsciowy";
            break;
    }
    else
        cout <<"Podaj argumenty:\n\t-a - kodowanie arytmetyczne\n\t-h - Kodowanie huffmana:\n\t\t-k -kodowanie pliku \n\t\t-d -dekodowanie pliku\n\t\tplik wejsciowy \n\t\tplik wyjsciowy\n";

    return 0;
}
